from torqueSrc.tools.lambdaOptDecorator import CleanDecorator
from torqueSrc.tools.getPlotly import show3dFig

from common.config import torqueConfig as Config

from torqueSrc.tools.loadFile import fitLineRegressCsv, inverseCurveFitCsv
from torqueSrc.tools.loadFile import toCsv, toLambdaAttrCsv
from toolsSrc.files.loadFiles import loadfileIndepend

# @CleanDecorator.drop_duplicates
@CleanDecorator.drop_bigorsmall
#@CleanDecorator.drop_discretePoint
def hisCleanProcess(X):
    print('cleanProcess 进行中.............')
    return X

def lambdaOptProcess():
    # 以字典形式读入hisRoot文件夹数据文件{文件名：数据df}
    X = {}
    columsList = [Config.WindSpeed, Config.ActPower, Config.RotateSpeed]
    loadfileIndepend(Config.historyDataRoot, X, columsList)

    # 遍历字典，对value数据点进行clean
    for key in X.keys():
        X[key] = hisCleanProcess(X[key])

    '''
    遍历字典，计算平均风能利用系数 （1）计算法风能利用系数平均值。（2）剔除距平均值50%以外的点。（3）重新统计风能利用系数平均值
    '''
    # （1）计算法风能利用系数平均值
    aveCp = {}
    for key in X.keys():
        X[key]['Cp'] = X[key][Config.ActPower]/X[key][Config.WindSpeed]**3
        # aveCp[key] = X[key]['Cp'].mean()
        aveCp[key] = X[key]['Cp'].median()
    print("aveCp_1: ", aveCp)

    #     # （2）剔除距平均值50%以外的点
    # for key in X.keys():
    #     X[key] = X[key][ (X[key]['Cp']>=aveCp[key]*0.0) & (X[key]['Cp']<=aveCp[key]*2) ]
    #
    #     # (3)重新统计风能利用系数平均值
    # aveCp = {}
    # for key in X.keys():
    #     X[key]['Cp'] = X[key][Config.ActPower] / X[key][Config.WindSpeed] ** 3
    #     aveCp[key] = X[key]['Cp'].mean()
    # # print('X3: ', X)
    # print("aveCp_2: ", aveCp)


    # 找到最大平均风能利用系数，返回对应 key
    maxAveCp = 0
    maxAveCpKey =""
    for key in aveCp.keys():
        if aveCp[key] > maxAveCp:
            maxAveCp = aveCp[key]
            maxAveCpKey = key
    print("maxAveCp: ", maxAveCp)
    print("maxAveCpKey: ", maxAveCpKey)

    X[maxAveCpKey].to_csv(Config.hisOptCleanProcess, index=False)   # 好像其它地方没有用到这个文件
    # 缺了一个写 Attr 过程？？？？？

    # rotateSpeed 切片求 windSpeed平均值
    X[maxAveCpKey][Config.RotateSpeed] = round(X[maxAveCpKey][Config.RotateSpeed] / Config.scale_RotateSpeed, 0) * Config.scale_RotateSpeed  # 将最优文件的转速列保留 scale_RotateSpeed 小数点位数，用于groupby分组
    roWsGroup = X[maxAveCpKey].groupby(Config.RotateSpeed, as_index=False)[Config.WindSpeed]  # 按rotate分组，对windSpeed统计
    roWsGroup = roWsGroup.mean()
    roWsGroup['aveCp'] = maxAveCp
    roWsGroup.to_csv(Config.hisLambdaOptProcess)
    # print("roWsGroup: ", roWsGroup)

    # 最小二乘法拟合windSpeed vs. rotateSpeed直线,并且新增一列 aveCp
    inverseCurveFitCsv(Config.hisLambdaOptProcess, Config.hisLambdaOptProcess, maxAveCp)
    toLambdaAttrCsv(Config.hisLambdaOptProcess, Config.hisLambdaOptAttr)

if __name__ == '__main__':
    lambdaOptProcess()